(PYTHON) Day - 19 Classes

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank


Classes


Classes: Dealing with Complex Numbers


문제 : 복소수 2개를 입력 받고 4칙연산과 나머지를 구하는 문제
입력 : 실수와 허수 부분을 정수로 입력(e.g. 2 1 -> 2.00 + 1.00i)
출력 : 더하기, 빼기, 곱하기, 나누기, 나머지를 출력

복소수의 사칙연산 - HI-KIM
덧셈
뺄셈
곱셈
나눗셈
모듈러스

2 1
5 6

7.00+7.00i
-3.00-5.00i
4.00+17.00i
0.26-0.11i
2.24+0.00i
7.81+0.00i

나눗셈이 가장 까다로웠다. 공식대로 푸는 방법과 실수, 허수 부분을 구분해서 구하는 방법 2가지로 구현할 수 있다.

import math

class Complex(object):
def **init**(self, real, imaginary):
self.real = real
self.imaginary = imaginary

def __add__(self, no):
real = self.real + no.real
imaginary = self.imaginary + no.imaginary
return Complex(real, imaginary)

def __sub__(self, no):
real = self.real - no.real
imaginary = self.imaginary - no.imaginary
return Complex(real, imaginary)

def __mul__(self, no):
real = (self.real * no.real) - (self.imaginary * no.imaginary)
imaginary = (self.real * no.imaginary) + (self.imaginary * no.real)
return Complex(real, imaginary)

def __truediv__(self, no):
# 공식 대입
# calc = self.__mul__(Complex(no.real, -1 * no.imaginary).__mul__(Complex(1.0/(no.mod().real**2), 0)))

# 실수 허수 따로 계산
denom = no.real**2 + no.imaginary**2
real = (self.real * no.real + self.imaginary * no.imaginary) / denom
imaginary = (self.imaginary * no.real - self.real * no.imaginary) / denom
calc = Complex(real, imaginary)
return calc

def mod(self):
return Complex(math.sqrt(self.real**2 + self.imaginary**2), 0)

def __str__(self):
if self.imaginary == 0:
result = "%.2f+0.00i" % (self.real)
elif self.real == 0:
if self.imaginary >= 0:
result = "0.00+%.2fi" % (self.imaginary)
else:
result = "0.00-%.2fi" % (abs(self.imaginary))
elif self.imaginary > 0:
result = "%.2f+%.2fi" % (self.real, self.imaginary)
else:
result = "%.2f-%.2fi" % (self.real, abs(self.imaginary))
return result

if **name** == '**main**':
A = Complex(*map(float, input().split()))
B = Complex(*map(float, input().split()))

print(A + B)
print(A - B)
print(A * B)
print(A / B)
print(A.mod())
print(B.mod())

Class 2 - Find the Torsional Angle


문제 : 3차원 공간에서 평면 ABC와 BCD가 이루는 각도를 구하는 문제
입력 : 3차원 직교 좌표계로 입력
출력 : (radian이 아닌) degree로 출력

angle

0 4 5
1 7 6
0 5 9
1 7 2

8.19

matplotlib 를 사용하여 예제의 좌표를 찍고 ABC, BCD 삼각형을 그려보았다.
matplotlib

import math

class Points(object):
def **init**(self, x, y, z):
(self.x, self.y, self.z) = (x, y, z)

def __sub__(self, no):
return Points((self.x - no.x), (self.y - no.y), (self.z - no.z))

def dot(self, no):
return (self.x * no.x) + (self.y * no.y) + (self.z * no.z)

def cross(self, no):
return Points((self.y * no.z - self.z * no.y), (self.z * no.x - self.x * no.z),
(self.x * no.y - self.y * no.x))

def absolute(self):
return pow((self.x ** 2 + self.y ** 2 + self.z ** 2), 0.5)

if **name** == '**main**':
points = list()
for i in range(4):
a = list(map(float, input().split()))
points.append(a)

a, b, c, d = Points(*points[0]), Points(*points[1]), Points(*points[2]), Points(*points[3])
x = (b - a).cross(c - b)
y = (c - b).cross(d - c)
angle = math.acos(x.dot(y) / (x.absolute() * y.absolute()))

print("%.2f" % math.degrees(angle))